package com.epoint.bookmanagement.bizlogic.bookinfo;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collector;
import java.util.stream.Collectors;

import org.w3c.dom.css.ElementCSSInlineStyle;

import com.alibaba.druid.sql.ast.expr.SQLCaseExpr.Item;
import com.epoint.bookmanagement.bizlogic.bookinfo.domain.BookAndBorrowInfoVo;
import com.epoint.bookmanagement.bizlogic.bookinfo.domain.BookInfo;
import com.epoint.bookmanagement.dao.BookInfoDao;

import cn.hutool.core.date.DateUnit;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;

/**
 * 图书信息的业务层
 * 
 * @author
 *
 */
public class BookInfoService {

	BookInfoDao bookInfoDao = new BookInfoDao();

	/**
	 * 根据书名图书类型模糊查询图书信息
	 * 
	 * @param pageIndex 页号
	 * @param pageSize  页面大小
	 * @param bookname  书名
	 * @param booktype  类型
	 * @return
	 */
	public List<BookInfo> queryBookinfoByKeyWords(Integer pageIndex, Integer pageSize, String bookname, Integer booktype) {
		return bookInfoDao.queryBookinfoByKeyWords(pageIndex, pageSize, bookname, booktype);
	}

	/**
	 * 根据id查询图书信息
	 * 
	 * @param bookId id
	 * @return 结果
	 */
	public BookInfo queryBookInfoByID(String bookId) {
		return bookInfoDao.queryBookInfoByID(bookId);
	}

	/**
	 * 新增图书信息
	 * 
	 * @param bookInfo 图书信息
	 * @return 结果
	 */
	public int addBookInfo(BookInfo bookInfo) {
		return bookInfoDao.addBookInfo(bookInfo);
	}

	/**
	 * 更新操作
	 * 
	 * @param bookinfo 书信息
	 * @return 条数
	 */
	public int updateBookinfo(BookInfo bookInfo) {
		return bookInfoDao.updateBookinfo(bookInfo);
	}

	/**
	 * 根据对象所有属性进行模糊查询
	 * 
	 * @param pageIndex 页号
	 * @param pageSize  页面大小
	 * @param bookInfo  书本信息
	 * @return 结果
	 */
	public List<BookInfo> queryBookinfoByBookInfo(Integer pageIndex, Integer pageSize, BookInfo bookInfo,
			String... columns) {
		return bookInfoDao.queryBookinfoByBookInfo(pageIndex, pageSize, bookInfo, columns);
	}

	/**
	 * 判断排除现有的图书，检查其他所有图书中是否重名
	 * 
	 * @param beforeBookName 数据库现有的
	 * @param nowBookName    如今修改的
	 * @param author         图书作者
	 * @return 结果
	 */
	public BookInfo checkExist(String beforeBookId, String nowBookName, String author) {
		return bookInfoDao.checkExist(beforeBookId, nowBookName, author);
	}

	/**
	 * 隔开的多个id，实现单表的多选删除
	 * 
	 * @param bookIds id集合
	 * @return 结果
	 */
	public String deleteBookinfo(String bookIds) {
		// 存放相关数据
		Map<String, String> allowDelete = new HashMap<>();
		Map<String, String> notAllowDelete =  new HashMap<>();
		
		List<BookAndBorrowInfoVo> list = bookInfoDao.selectBookAndBorrowInfoByBookId(bookIds);
		// 转成Map<bookId, List<BookAndBorrowInfoVo>>
		Map<String, List<BookAndBorrowInfoVo>> voMap = list.stream().collect(Collectors.groupingBy(BookAndBorrowInfoVo::getBookId));
	
		
		boolean isReturnTime = false;
		for(Map.Entry<String, List<BookAndBorrowInfoVo>> mEntry : voMap.entrySet()) {
			String bookId = mEntry.getKey();
			List<BookAndBorrowInfoVo> value = mEntry.getValue();
			// 如果只有一条信息且已经归还
			if (value.size() == 1 && ObjectUtil.isNotNull(value.get(0).getReturnTime())) {
				allowDelete.put(bookId, value.get(0).getBookName());
				continue ;
			}
			// 多条信息
			for(BookAndBorrowInfoVo item : value) {
				//  如果存在未归还的信息 则无法删除该图书
				if (ObjectUtil.isNull(item.getReturnTime())) {
					isReturnTime = true;
				}
			}
			// 判断是否可以删除
			if (isReturnTime) {
				notAllowDelete.put(bookId, value.get(0).getBookName());
			} else {
				allowDelete.put(bookId, value.get(0).getBookName());
			}
			// 还原
			isReturnTime = false;
		}
		
		String delBookIds = allowDelete.keySet().toString();
		delBookIds = delBookIds.substring(1, delBookIds.length() - 1).replaceAll(", ", ",");

		// 删除接口
		String allowStr = "";
		if (!allowDelete.isEmpty()) {
			int  i = bookInfoDao.deleteBookAndBorrowInfo(delBookIds);
			allowStr = allowDelete.values().toString();
			allowStr = allowStr.substring(1, allowStr.length() - 1).replaceAll(", ", "、");
			
			// 信息拼接
			if (i > 0) {
				allowStr += "删除成功！"+ "</br>";
	 		} else {
	 			allowStr += "删除失败！"+ "</br>";
			}
		}
		
		
		// 错误信息拼接
		String notAllowStr = "";
		if (!notAllowDelete.isEmpty()) {
			notAllowStr = notAllowDelete.values().toString();
			notAllowStr = notAllowStr.substring(1, notAllowStr.length() - 1).replaceAll(", ", "、") + "存在借阅信息，删除失败！" + "</br>";
		}
		
		return allowStr + notAllowStr;
	}

	/**
	 * 根据bookid获取图书信息Map<bookid, BookInfo>
	 * @param bookIds id集合
	 * @return 结果
	 */
	public Map<String, BookInfo> queryBookInfoByIds(List<String> bookIds) {
		return bookInfoDao.queryBookInfoByIds(bookIds);
	}
	
}
